﻿/** 自制的UI模块(utf-8 with BOM)
  包括界面设定和热键宏定义
  预定义了最多12个热键设置
  可设定预设
  
  By setycyas @2023-01-28
*/

/* 全局
*/{

  ;** 库调用
  #Include ..\MyAhkModules\MyFuns.ahk ;自制常用函数库,所有导出函数以MyFuns_开头

  ;全局常量
  global __MyUI_MAX_MACROS := 12 ;指定最大热键数量,如修改此项,下面的__MyUI_GmacroX的数量也需要改变

  ;** 全局变量
  ;窗口标题,在MyUI_setup()函数中设定
  global __MyUI_title := "MyUI"
  ;可能选择的exe字符串表,用于gui组件,按组件格式写,如WinKawaks.exe|X-Zone.exe|fbas.exe|Nebula.exe,
  ;需要在MyUI_setup()函数中设定
  global __MyUI_exeList := ""
  ;宏名称字符串表,用于gui组件,按组件格式写,如"空|下前A|下上A|下B|下前B|前A|A后防御|前C|前冲A|后前A|龙2小跳BB|快速旋转A"
  ;需要在MyUI_setup()函数中设定
  global __MyUI_macroList := ""
  ;宏数量,最大为12,需要在MyUI_setup()函数中设定
  global __MyUI_macroNums := 0
  ;宏热键数组,在MyUI_setup()函数中设定
  global __MyUI_macroKeys := []
  ;设定提交次数,如果是0则表示之前没设置过
  global __MyUI_submitTimes := 0
  ;预设,每一项都指定一个宏设定,需要在MyUI_setup()函数中设定
  ;每一项如:__MyUI_preset["龙2暗黑秘影"] := ["下前A", "下上A", "A后防御", "下前B", "快速旋转A"],数量必须与__MyUI_macroNums相同
  global __MyUI_preset := {}
  __MyUI_preset["默认"] := ["空", "空", "空", "空", "空", "空", "空", "空", "空", "空", "空", "空"]
  
  ;** 绑定gui组件的全局变量,以G开头
  ;exe选择
  global __MyUI_Gexe := ""
  ;各个热键对应的宏选择,默认为空,这里设定为10个,实际显示数量与__MyUI_macroNums相等
  global __MyUI_Gmacro1 := "空", __MyUI_Gmacro2 := "空", __MyUI_Gmacro3 := "空", __MyUI_Gmacro4 := "空", __MyUI_Gmacro5 := "空"
  global __MyUI_Gmacro6 := "空", __MyUI_Gmacro7 := "空", __MyUI_Gmacro8 := "空", __MyUI_Gmacro9 := "空", __MyUI_Gmacro10 := "空"
  global __MyUI_Gmacro11 := "空", __MyUI_Gmacro12 := "空"

}

/* gui设定与响应函数 
*/{

  ;** 设置gui
  __MyUI_setupGui(){
    local k, v ;循环用临时变量
	local macroKey ;宏热键临时变量
    Gui, New, , %__MyUI_title%
    Gui, Add, Tab3, , 初始设定|热键设定|自定义 ;标签页分组
    Gui, Tab, 初始设定
    ;exe选择
    Gui, Add, Text, x+20 y+20, 选择exe：
    Gui, Add, ComboBox, xp+80 yp-3 W100 v__MyUI_Gexe choose1, %__MyUI_exeList%
    Gui, Tab, 热键设定
    ;宏绑定选择
    loop, %__MyUI_macroNums% {
	  macroKey := __MyUI_macroKeys[A_Index]
      if (A_Index == 1) {
        Gui, Add, Text, x+20 y+20, %macroKey%键：
      } else {
        Gui, Add, Text, xp-80 yp+30, %macroKey%键：
      }
      Gui, Add, ComboBox, xp+80 yp-3 W100 v__MyUI_Gmacro%A_Index% choose1, % "空|" . __MyUI_macroList
	}
	Gui, Tab, 自定义
	;重要!设置自定义Gui组件的接口
	if (IsFunc("MyUI_customGui")){
	  MyUI_customGui()
	}
    Gui, Tab
    ;提交数据按钮
    Gui, Add, Button, g__MyUI_ButtonSubmit, 提交
    ;预设菜单
    for k, v in __MyUI_preset {
	  ;每一个预设制作一个菜单项,名字为PresetMenuItem,点击时执行函数__MyUI_MenuReadPreset()
      Menu, __MyUI_PresetMenuItem, Add, %k%, MyUI_MenuReadPreset 
    }
    Menu, __MyUI_PresetMenuBar, Add, 读取预设, :__MyUI_PresetMenuItem ;制作菜单,并让所有名为__MyUI_PresetMenuItem的菜单项加入
    Gui, Menu, __MyUI_PresetMenuBar ;加入菜单
    ;加入状态栏
    Gui, Add, StatusBar, , 未设定热键
    ;显示gui
    Gui, Show, X1136 Y393
	Gui, +AlwaysOnTop
  }
  
  ;** gui响应
  ;提交数据时的行动,并不绑定按键,因为可能有多种提交方式
  __MyUI_submit(){
    Gui, Submit, NoHide
	;首次设置,一些基础设定只能设置一次,设置后禁用
	if (__MyUI_submitTimes == 0){
	  GuiControl, Disable, __MyUI_Gexe
	}
	__MyUI_setMacros() ;重新设置热键对应的宏
	__MyUI_submitTimes += 1
    SB_SetText(A_Hour . ":" . A_Min . ":" . A_Sec . " 提交")
	;重要!提交数据后的接口
	if (IsFunc("on_MyUI_Submit")){
	  on_MyUI_Submit()
	}
  }
  ;提交数据按钮
  __MyUI_ButtonSubmit(){
    __MyUI_submit()
    MsgBox, 数据提交成功!
  }
  ;读取预设,把各个技能的ComboBox修改成预设值但不提交数据,这个可供外部调用
  MyUI_MenuReadPreset(ItemName){
    loop, %__MyUI_macroNums% {
      GuiControl, ChooseString, __MyUI_Gmacro%A_INDEX%, % __MyUI_preset[ItemName][A_INDEX]
    }
    SB_SetText(A_Hour . ":" . A_Min . ":" . A_Sec . " 读取预设 - " . ItemName)
  }
  ;关闭gui退出
  GuiClose(guiHwnd){
    ExitApp
  }
  
}

/* 设置热键相关
*/{
 
  ;设置技能热键,若技能热键为空则跳过
  __MyUI_setMacros(){
    local ahkExe := "ahk_exe " . __MyUI_Gexe
	local macroKey ;宏热键命临时变量
	local macroName ;宏热键命临时变量
    loop, %__MyUI_macroNums% {
      macroName := __MyUI_Gmacro%A_Index%
      macroKey := __MyUI_macroKeys[A_Index]
      MyFuns_setHotkey(macroKey, macroName, ahkExe)
    }
  }

  ;热键可能对应的空函数
  空(){
    return
  }

}

/* 导出函数 
*/
;使用本模块设置UI(含Gui和宏设置),
;title为窗口标题
;exeList设置可选择的exe,格式为"exe1|exe2..."的字符串
;macroKeys指定各个热键,是[],长度超过12的部分会被舍弃
;macroList设置可选择的宏,格式为"宏1|宏2..."的字符串
;preset是预设{},格式见__MyUI_preset说明,可以留空做成无预设
MyUI_setup(title, exeList, macroKeys, macroList, preset := ""){
  ;读取参数
  __MyUI_title := title
  __MyUI_exeList := exeList
  __MyUI_macroKeys := macroKeys
  __MyUI_macroNums := MyFuns_arrMin([macroKeys.Count(), __MyUI_MAX_MACROS])
  __MyUI_macroList := macroList
  if (preset != ""){
    __MyUI_preset := preset
  }
  ;设置Gui
  __MyUI_setupGui()
}

;这个是接口!!!如制作Gui时在自定义页面需要添加组件,则实现这个接口
;MyUI_customGui()
;这个是接口!!!如提交数据时有其他代码,则实现这个接口
;on_MyUI_Submit()
